/**
 ******************************************************************************
 * @file           : bsp_iic_config.h
 * @brief          : IIC Configuration File (STM32F1xx)
 ******************************************************************************
 * @attention
 *
 * 硬件I2C配置文件（基于STM32 HAL库）
 * 支持配置驱动的I2C外设选择和引脚重映射
 * 用户通过修改宏定义来选择I2C外设（配置驱动设计）
 *
 ******************************************************************************
 */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __BSP_IIC_CONFIG_H
#define __BSP_IIC_CONFIG_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "stm32f1xx.h"

/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/

/* ============================================================================ */
/*                       日志系统配置（改这里的数字）                             */
/* ============================================================================ */
/* 日志后端选择：1=EasyLogger, 2=printf, 0=关闭 */
#define IIC_USE_LOG     1

/* 根据配置自动定义日志宏 */
#if (IIC_USE_LOG == 1)
    /* 使用EasyLogger */
    #ifndef LOG_TAG
        #define LOG_TAG    "IIC"
    #endif
    #include "elog.h"
    
#elif (IIC_USE_LOG == 2)
    /* 使用printf */
    #include <stdio.h>
    #define log_i(fmt, ...)     printf(fmt "\r\n", ##__VA_ARGS__)
    #define log_w(fmt, ...)     printf("[WARN] " fmt "\r\n", ##__VA_ARGS__)
    #define log_e(fmt, ...)     printf("[ERROR] " fmt "\r\n", ##__VA_ARGS__)
    #define log_d(fmt, ...)     printf("[DEBUG] " fmt "\r\n", ##__VA_ARGS__)
    
#else
    /* 关闭日志 */
    #define log_i(fmt, ...)
    #define log_w(fmt, ...)
    #define log_e(fmt, ...)
    #define log_d(fmt, ...)
#endif

/* ============================================================================ */
/*                          用户配置区（修改这里的数字）                          */
/* ============================================================================ */

/**
 * I2C外设选择
 * 
 * 可选值：
 *   1 = I2C1
 *   2 = I2C2
 */
#define IIC_SELECT_NUM      1       /*!< I2C外设选择（1或2） */

/**
 * I2C引脚重映射配置
 * 
 * 可选值：
 *   0 = 标准引脚映射
 *   1 = 重映射
 * 
 * 引脚映射表：
 *   I2C1标准(0):  PB6(SCL), PB7(SDA)
 *   I2C1重映射(1): PB8(SCL), PB9(SDA)
 *   I2C2标准(0):  PB10(SCL), PB11(SDA) - 不支持重映射
 */
#define IIC_REMAP_MODE      0       /*!< 引脚重映射模式 */

/**
 * I2C速度配置（单位：Hz）
 * 
 * 标准模式：100000 (100kHz)
 * 快速模式：400000 (400kHz)
 */
#define IIC_SPEED           100000  /*!< I2C通信速度 */

/**
 * I2C地址模式
 * 
 * 可选值：
 *   7  = 7位地址模式
 *   10 = 10位地址模式
 */
#define IIC_ADDR_MODE       7       /*!< I2C地址模式（7或10） */

/**
 * I2C超时配置（单位：ms）
 */
#define IIC_TIMEOUT_MS      1000    /*!< I2C操作超时时间 */

/* ============================================================================ */
/*            配置自动转换（用户无需修改，自动根据上面的选择生成）                */
/* ============================================================================ */

/* I2C外设选择 */
#if (IIC_SELECT_NUM == 1)
    /* I2C1配置 */
    #define IIC_I2Cx                        I2C1
    #define IIC_I2Cx_CLK_ENABLE()           __HAL_RCC_I2C1_CLK_ENABLE()
    #define IIC_I2Cx_CLK_DISABLE()          __HAL_RCC_I2C1_CLK_DISABLE()
    #define IIC_I2Cx_FORCE_RESET()          __HAL_RCC_I2C1_FORCE_RESET()
    #define IIC_I2Cx_RELEASE_RESET()        __HAL_RCC_I2C1_RELEASE_RESET()
    
    /* 引脚配置 */
    #if (IIC_REMAP_MODE == 0)
        /* I2C1标准映射：PB6(SCL), PB7(SDA) */
        #define IIC_SCL_GPIO_PORT           GPIOB
        #define IIC_SCL_GPIO_PIN            GPIO_PIN_6
        #define IIC_SDA_GPIO_PORT           GPIOB
        #define IIC_SDA_GPIO_PIN            GPIO_PIN_7
        #define IIC_GPIO_REMAP_CONFIG()     do{ /* 标准映射，无需配置 */ }while(0)
        
    #elif (IIC_REMAP_MODE == 1)
        /* I2C1重映射：PB8(SCL), PB9(SDA) */
        #define IIC_SCL_GPIO_PORT           GPIOB
        #define IIC_SCL_GPIO_PIN            GPIO_PIN_8
        #define IIC_SDA_GPIO_PORT           GPIOB
        #define IIC_SDA_GPIO_PIN            GPIO_PIN_9
        #define IIC_GPIO_REMAP_CONFIG()     do{ \
            __HAL_RCC_AFIO_CLK_ENABLE(); \
            __HAL_AFIO_REMAP_I2C1_ENABLE(); \
        }while(0)
        
    #else
        #error "IIC_REMAP_MODE must be 0 or 1 for I2C1"
    #endif
    
    #define IIC_GPIO_CLK_ENABLE()           __HAL_RCC_GPIOB_CLK_ENABLE()
    
#elif (IIC_SELECT_NUM == 2)
    /* I2C2配置 */
    #define IIC_I2Cx                        I2C2
    #define IIC_I2Cx_CLK_ENABLE()           __HAL_RCC_I2C2_CLK_ENABLE()
    #define IIC_I2Cx_CLK_DISABLE()          __HAL_RCC_I2C2_CLK_DISABLE()
    #define IIC_I2Cx_FORCE_RESET()          __HAL_RCC_I2C2_FORCE_RESET()
    #define IIC_I2Cx_RELEASE_RESET()        __HAL_RCC_I2C2_RELEASE_RESET()
    
    /* I2C2标准映射：PB10(SCL), PB11(SDA) - 不支持重映射 */
    #define IIC_SCL_GPIO_PORT               GPIOB
    #define IIC_SCL_GPIO_PIN                GPIO_PIN_10
    #define IIC_SDA_GPIO_PORT               GPIOB
    #define IIC_SDA_GPIO_PIN                GPIO_PIN_11
    #define IIC_GPIO_REMAP_CONFIG()         do{ /* I2C2不支持重映射 */ }while(0)
    #define IIC_GPIO_CLK_ENABLE()           __HAL_RCC_GPIOB_CLK_ENABLE()
    
    /* I2C2不支持重映射，检查配置 */
    #if (IIC_REMAP_MODE != 0)
        #warning "I2C2 does not support pin remapping, IIC_REMAP_MODE will be ignored"
    #endif
    
#else
    #error "IIC_SELECT_NUM must be 1 or 2"
#endif

/* I2C地址模式 */
#if (IIC_ADDR_MODE == 7)
    #define IIC_ADDRESSING_MODE             I2C_ADDRESSINGMODE_7BIT
#elif (IIC_ADDR_MODE == 10)
    #define IIC_ADDRESSING_MODE             I2C_ADDRESSINGMODE_10BIT
#else
    #error "IIC_ADDR_MODE must be 7 or 10"
#endif

/* I2C占空比（仅快速模式有效） */
#if (IIC_SPEED <= 100000)
    #define IIC_DUTY_CYCLE                  I2C_DUTYCYCLE_2     /* 标准模式 */
#else
    #define IIC_DUTY_CYCLE                  I2C_DUTYCYCLE_2     /* 快速模式：2:1 */
#endif

/* Exported macro ------------------------------------------------------------*/
/* Exported variables --------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/

#ifdef __cplusplus
}
#endif

#endif /* __BSP_IIC_CONFIG_H */
